/**
 * 838. 推多米诺
 * https://leetcode-cn.com/problems/push-dominoes/
 */
public class Solutions_838 {
    public static void main(String[] args) {
//        String str = ".L.R...LR..L..";  // output: "LL.RR.LLRRLL.."
        String str = "RR.L";  // output: "RR.L"

        String result = pushDominoes(str);
        System.out.println(result);
    }

    public static String pushDominoes(String dominoes) {
        // 计算出每个牌的受力
        int L = dominoes.length();
        char[] arr = dominoes.toCharArray();
        // forces[i] = 5，表示索引 i 受力为 5，为正数，则向右倒向
        // forces[i] = -5，表示索引 i 受力为 -5，为负数，则向左倒向
        int[] forces = new int[L];
        // 正序扫描（计算每个牌受到的向右倒向的力）
        int force = 0;
        for (int i = 0; i < L; i++) {
            if (arr[i] == 'R') {
                force = L;
            } else if (arr[i] == 'L') {
                force = 0;
            } else {
                force = Math.max(force - 1, 0);
            }
            // 向右的受力为 force
            forces[i] += force;
        }
        // 逆序扫描（计算每个牌受到的向左倒向的力）
        force = 0;
        for (int i = L - 1; i >= 0; i--) {
            if (arr[i] == 'L') {
                force = L;
            } else if (arr[i] == 'R') {
                force = 0;
            } else {
                force = Math.max(force - 1, 0);
            }
            // 向左的受力为 force
            forces[i] -= force;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < L; i++) {
            if (forces[i] == 0) {
                sb.append('.');
            } else if (forces[i] > 0) {
                sb.append('R');
            } else {
                sb.append('L');
            }
        }
        return sb.toString();
    }
}
